/** @module uploadFile */
import {
  getOssPolicy
} from '../api/system'

/**
 * @callback success
 * @param { Array } responseImage 上传成功图片路径
 */
/**
 * @callback error
 * @param { Array } responseImage 上传失败图片路径
 */
/**
 * 选择图片并上传到阿里云
 * @param { Array } sourceType 选择图片的来源
 * @param { Number } count 最多可以选择的图片张数
 * @param { success } successCallback 成功回调
 * @param { error } errorCallback 失败回调
 * @example
 * chooseImage(['album', 'camera'], 9, success(res=>{}),error(err=>{}))
 */

function chooseImage(sourceType, count, successCallback, errorCallback) {
  wx.chooseImage({
    count: count,
    sourceType: sourceType,
    success: chooseImageRes => {
      new Promise((resolve, reject) => {
        // 获取阿里云配置
        getOssPolicy.then(res => {
          resolve(res.data.result);
        }).catch(err => {
          errData && errorCallback(err)
        })
      }).then(config => {
        const tempFiles = chooseImageRes.tempFiles;
        let maxCount = 0 // 超过50MB文件的数量
        const sucData = [] // 上传成功文件
        const errData = [] // 上传失败文件及失败原因
        for (let i = 1; i <= tempFiles.length; i++) {
          wx.showLoading({
            title: '上传中' + i + '/' + tempFiles.length,
            mask: true
          })
          // 是否存在超过最大文件大小50MB
          if (tempFiles[i - 1].size / 1024 / 1024 > 50) {
            maxCount++
            return true
          } else {
            // 上传至阿里云
            uploadFile(config, tempFiles[i - 1].path, tempFiles[i - 1].name).then(result => {
              if (i === tempFiles.length) {
                if (maxCount === 0) {
                  wx.showToast({
                    title: '上传完成',
                    mask: true
                  })
                } else {
                  wx.showToast({
                    title: '存在' + maxCount + '个文件上传失败,文件超过50MB!',
                    icon: 'none'
                  })
                }
              }
              sucData.push(result)
            }).catch(error => {
              errData.push(error)
            })
          }
        }
        sucData && successCallback(sucData)
        errData && errorCallback(errData)
      })
    }
  })
}

/***
 * 上传文件到阿里云
 * @param { Object } config 后台返回阿里云相关参数
 * @param { String } config.accessKeyId 临时AccessKeyID
 * @param { String } config.dir 存储路径
 * @param { String } config.host OSS地址
 * @param { String } config.policy 加密策略
 * @param { String } config.signature 签名
 * @param { String } filePath: 文件路径
 * @param { String } fileName: 文件名称
 * @param { Function } successCallback: 成功回调
 * @param { Function } errorCallback: 失败回调
 */
function uploadFile(config, filePath, fileName) {
  return new Promise((resolve, reject) => {
    // OSS地址
    const aliyunServerURL = config.host
    // 存储路径(后台固定位置+随即数+文件格式)
    const aliyunFileKey = config.dir + new Date().getTime() + Math.floor(Math.random() * 100) + fileName
    // 临时AccessKeyID0
    const OSSAccessKeyId = config.accessKeyId
    // 加密策略
    const policy = config.policy
    // 签名
    const signature = config.signature
    wx.uploadFile({
      url: aliyunServerURL,
      filePath: filePath, //要上传文件资源的路径
      name: 'file', //必须填file
      formData: {
        'key': aliyunFileKey,
        'policy': policy,
        'OSSAccessKeyId': OSSAccessKeyId,
        'signature': signature,
        'success_action_status': '200',
      },
      success: function (res) {
        if (res.statusCode != 200) {
          reject(new Error({
            fileName: fileName,
            error: JSON.stringify(res)
          }));
          reject(new Error('上传错误:' + JSON.stringify(res)))
          return;
        }
      },
      fail: function (err) {
        reject(new Error({
          fileName: fileName,
          error: err
        }));
      },
    })
  })
}

module.exports = {
  chooseImage: chooseImage
}
